#ifndef __CLIENTFUNC__
#define __CLIENTFUNC__

#include "54func.h"
#define TRAINLEN 1000

//全局变量
extern int loginFlag;

// 结构体定义
// 存储cmd及参数的结构体
typedef struct {
    char cmdToken[6];
    int argc;
    char argv1[4096];
    char argv2[4096];
} cmd_t;

// 小火车
typedef struct train_s
{
    int length;
    char data[TRAINLEN];
} train_t;


// 辅助函数
// 判断路径是否和传入类型匹配
// 传入S_IFREG(普通文件)或S_IFDIR(目录)判断类型
int pathJudge(const char* realPath, mode_t mode);
// recvn
int recvn(int sockfd, void *buf, int length);
// 根据传入的路径(cmd_t结构体中的一个argv字符串,可相对可绝对)
// 获取真实的Linux绝对路径存入realPath中
int realPath(const char *argv, char *realPath);
// 接收确认信息'e'或'o', 信息为'o'时返回1, 为'e'时读取报错信息并打印, 返回0
int recvMsg(int sockfd, train_t* ptrain);
// 用小火车发送字符串
int strSend(int netfd, train_t* ptrain, const char* str);
// 发送成功信息'o'
int successSend(int netfd);
// 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
// 如果填入字符串, 将其作为报错信息发送给客户端
int errorSend(int netfd, const char* errorMsg);


// 解析指令+上传指令
int parseToken(int sockfd, char *command, cmd_t *pcmd);
// 接收服务端返回值+相应处理(调用puts+gets)
int cmdClientHandler(int sockfd, const cmd_t *pcmd);

// 指令函数
// 处理pwd指令的返回值
int pwdProc(int sockfd);
// 处理cd指令的返回值
int cdProc(int sockfd);
// 处理ls指令的返回值
int lsProc(int sockfd);
// 处理rm指令的返回值
int rmProc(int sockfd);
// 处理mkdir指令的返回值
int mkdirProc(int sockfd);

// 上传文件
int clientPuts(int sockfd, const cmd_t *pcmd);
// 下载文件
int clientGets(int sockfd, const cmd_t *pcmd);

// 处理login指令的S返回值
int userLoginProc(int sockfd);
// 处理userAdd指令的S返回值
int userAddProc(int sockfd);
// 处理logout指令的S返回值
int userLogoutProc(int sockfd);

#endif
